home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / bone.zip / DOG.QC < prev    next >
Text File  |  1996-08-31  |  12KB  |  432 lines

  1. /*
  2. Throw the doggie a bone!     8/31/96 - Darin McNeil
  3.                            dhm7206@usl.edu
  4.  
  5. This patch makes the dog search the surrounding area for a bone.
  6. He will search while standing, walking, and attacking.
  7.  
  8. ==============================================================================
  9.  
  10. DOG
  11.  
  12. ==============================================================================
  13. */
  14. $cd /raid/quake/id1/models/dog
  15. $origin 0 0 24
  16. $base base
  17. $skin skin
  18.  
  19. $frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 attack8
  20.  
  21. $frame death1 death2 death3 death4 death5 death6 death7 death8 death9
  22.  
  23. $frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
  24. $frame deathb9
  25.  
  26. $frame pain1 pain2 pain3 pain4 pain5 pain6
  27.  
  28. $frame painb1 painb2 painb3 painb4 painb5 painb6 painb7 painb8 painb9 painb10
  29. $frame painb11 painb12 painb13 painb14 painb15 painb16
  30.  
  31. $frame run1 run2 run3 run4 run5 run6 run7 run8 run9 run10 run11 run12
  32.  
  33. $frame leap1 leap2 leap3 leap4 leap5 leap6 leap7 leap8 leap9
  34.  
  35. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
  36.  
  37. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8
  38.  
  39.  
  40. void() dog_leap1;
  41. void() dog_run1;
  42.  
  43. /*
  44. ================
  45. dog_bite
  46.  
  47. ================
  48. */
  49. void() dog_bite =
  50. {
  51. local vector    delta;
  52. local float     ldmg;
  53.  
  54.     if (!self.enemy)
  55.         return;
  56.  
  57.     ai_charge(10);
  58.  
  59.     if (!CanDamage (self.enemy, self))
  60.         return;
  61.  
  62.     delta = self.enemy.origin - self.origin;
  63.  
  64.     if (vlen(delta) > 100)
  65.         return;
  66.         
  67.     ldmg = (random() + random() + random()) * 8;
  68.     T_Damage (self.enemy, self, self, ldmg);
  69. };
  70.  
  71. void()    Dog_JumpTouch =
  72. {
  73.     local    float    ldmg;
  74.  
  75.     if (self.health <= 0)
  76.         return;
  77.         
  78.     if (other.takedamage)
  79.     {
  80.         if ( vlen(self.velocity) > 300 )
  81.         {
  82.             ldmg = 10 + 10*random();
  83.             T_Damage (other, self, self, ldmg);    
  84.         }
  85.     }
  86.  
  87.     if (!checkbottom(self))
  88.     {
  89.         if (self.flags & FL_ONGROUND)
  90.         {    // jump randomly to not get hung up
  91. //dprint ("popjump\n");
  92.     self.touch = SUB_Null;
  93.     self.think = dog_leap1;
  94.     self.nextthink = time + 0.1;
  95.  
  96. //            self.velocity_x = (random() - 0.5) * 600;
  97. //            self.velocity_y = (random() - 0.5) * 600;
  98. //            self.velocity_z = 200;
  99. //            self.flags = self.flags - FL_ONGROUND;
  100.         }
  101.         return;    // not on ground yet
  102.     }
  103.  
  104.     self.touch = SUB_Null;
  105.     self.think = dog_run1;
  106.     self.nextthink = time + 0.1;
  107. };
  108.  
  109.  
  110. void() dog_stand1    =[    $stand1,    dog_stand2    ] 
  111. {
  112.  // dhm - Look for a bone to chew while standing around.
  113.     local    entity    head;
  114.  
  115.     head = findradius(self.origin, 500);  
  116.             /* findradius returns a linked-list of entities within the specified
  117.             radius.  The next entity is pointed to by head.chain
  118.         */
  119.     while (head)
  120.     {
  121.         if (head.classname == "bone")     //Is the entity a bone?
  122.         {                    
  123.                  self.enemy = head;             //If it is a bone, make it the enemy.
  124.             self.goalentity = self.enemy;  //Make sure you tell the dog to chase it,
  125.             self.think = self.th_run;      //tell him to hurry.  Good boy.
  126.             self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin);
  127.             self.nextthink = time + 0.1;
  128.         }
  129.         head = head.chain;
  130.     }
  131.  // dhm - end
  132.  
  133.     ai_stand();
  134. };
  135. void() dog_stand2    =[    $stand2,    dog_stand3    ] {ai_stand();};
  136. void() dog_stand3    =[    $stand3,    dog_stand4    ] {ai_stand();};
  137. void() dog_stand4    =[    $stand4,    dog_stand5    ] {ai_stand();};
  138. void() dog_stand5    =[    $stand5,    dog_stand6    ] {ai_stand();};
  139. void() dog_stand6    =[    $stand6,    dog_stand7    ] {ai_stand();};
  140. void() dog_stand7    =[    $stand7,    dog_stand8    ] {ai_stand();};
  141. void() dog_stand8    =[    $stand8,    dog_stand9    ] {ai_stand();};
  142. void() dog_stand9    =[    $stand9,    dog_stand1    ] {ai_stand();};
  143.  
  144. void() dog_walk1    =[    $walk1 ,    dog_walk2    ] {
  145.  // dhm - Look for a bone to chew while strolling around.  Code comments above.
  146.     local    entity    head;
  147.  
  148.     head = findradius(self.origin, 500);
  149.     
  150.     while (head)
  151.     {
  152.         if (head.classname == "bone")
  153.         {
  154.                  self.enemy = head;
  155.                  self.goalentity = self.enemy;
  156.             self.think = self.th_run;
  157.             self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin);
  158.             self.nextthink = time + 0.1;
  159.         }
  160.         head = head.chain;
  161.     }
  162.  // dhm - end
  163.  
  164. if (random() < 0.2)
  165.     sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE);
  166. ai_walk(8);};
  167. void() dog_walk2    =[    $walk2 ,    dog_walk3    ] {ai_walk(8);};
  168. void() dog_walk3    =[    $walk3 ,    dog_walk4    ] {ai_walk(8);};
  169. void() dog_walk4    =[    $walk4 ,    dog_walk5    ] {ai_walk(8);};
  170. void() dog_walk5    =[    $walk5 ,    dog_walk6    ] {ai_walk(8);};
  171. void() dog_walk6    =[    $walk6 ,    dog_walk7    ] {ai_walk(8);};
  172. void() dog_walk7    =[    $walk7 ,    dog_walk8    ] {ai_walk(8);};
  173. void() dog_walk8    =[    $walk8 ,    dog_walk1    ] {ai_walk(8);};
  174.  
  175. void() dog_run1        =[    $run1  ,    dog_run2    ] {
  176. if (random() < 0.2)
  177.     sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE);
  178. ai_run(16);};
  179. void() dog_run2        =[    $run2  ,    dog_run3    ] {ai_run(32);};
  180. void() dog_run3        =[    $run3  ,    dog_run4    ] {ai_run(32);};
  181. void() dog_run4        =[    $run4  ,    dog_run5    ] {ai_run(20);};
  182. void() dog_run5        =[    $run5  ,    dog_run6    ] {ai_run(64);};
  183. void() dog_run6        =[    $run6  ,    dog_run7    ] {ai_run(32);};
  184. void() dog_run7        =[    $run7  ,    dog_run8    ] {ai_run(16);};
  185. void() dog_run8        =[    $run8  ,    dog_run9    ] {ai_run(32);};
  186. void() dog_run9        =[    $run9  ,    dog_run10    ] {ai_run(32);};
  187. void() dog_run10    =[    $run10  ,    dog_run11    ] {ai_run(20);};
  188. void() dog_run11    =[    $run11  ,    dog_run12    ] {ai_run(64);};
  189. void() dog_run12    =[    $run12  ,    dog_run1    ] {ai_run(32);};
  190.  
  191. void() dog_atta1    =[    $attack1,    dog_atta2    ] {ai_charge(10);};
  192. void() dog_atta2    =[    $attack2,    dog_atta3    ] {ai_charge(10);};
  193. void() dog_atta3    =[    $attack3,    dog_atta4    ] {ai_charge(10);};
  194. void() dog_atta4    =[    $attack4,    dog_atta5    ] {
  195. sound (self, CHAN_VOICE, "dog/dattack1.wav", 1, ATTN_NORM);
  196. dog_bite();};
  197. void() dog_atta5    =[    $attack5,    dog_atta6    ] {ai_charge(10);};
  198. void() dog_atta6    =[    $attack6,    dog_atta7    ] {ai_charge(10);};
  199. void() dog_atta7    =[    $attack7,    dog_atta8    ] {ai_charge(10);};
  200. void() dog_atta8    =[    $attack8,    dog_run1    ] {ai_charge(10);};
  201.  
  202. void() dog_leap1    =[    $leap1,        dog_leap2    ] {ai_face();};
  203. void() dog_leap2    =[    $leap2,        dog_leap3    ]
  204. {
  205.     ai_face();
  206.     
  207.     self.touch = Dog_JumpTouch;
  208.     makevectors (self.angles);
  209.     self.origin_z = self.origin_z + 1;
  210.     self.velocity = v_forward * 300 + '0 0 200';
  211.     if (self.flags & FL_ONGROUND)
  212.         self.flags = self.flags - FL_ONGROUND;
  213. };
  214.  
  215. void() dog_leap3    =[    $leap3,        dog_leap4    ] {};
  216. void() dog_leap4    =[    $leap4,        dog_leap5    ] {};
  217. void() dog_leap5    =[    $leap5,        dog_leap6    ] {};
  218. void() dog_leap6    =[    $leap6,        dog_leap7    ] {};
  219. void() dog_leap7    =[    $leap7,        dog_leap8    ] {};
  220. void() dog_leap8    =[    $leap8,        dog_leap9    ] {};
  221. void() dog_leap9    =[    $leap9,        dog_leap9    ] {};
  222.  
  223. void() dog_pain1    =[    $pain1 ,    dog_pain2    ] {};
  224. void() dog_pain2    =[    $pain2 ,    dog_pain3    ] {};
  225. void() dog_pain3    =[    $pain3 ,    dog_pain4    ] {};
  226. void() dog_pain4    =[    $pain4 ,    dog_pain5    ] {};
  227. void() dog_pain5    =[    $pain5 ,    dog_pain6    ] {};
  228. void() dog_pain6    =[    $pain6 ,    dog_run1    ] {};
  229.  
  230. void() dog_painb1    =[    $painb1 ,    dog_painb2    ] {};
  231. void() dog_painb2    =[    $painb2 ,    dog_painb3    ] {};
  232. void() dog_painb3    =[    $painb3 ,    dog_painb4    ] {ai_pain(4);};
  233. void() dog_painb4    =[    $painb4 ,    dog_painb5    ] {ai_pain(12);};
  234. void() dog_painb5    =[    $painb5 ,    dog_painb6    ] {ai_pain(12);};
  235. void() dog_painb6    =[    $painb6 ,    dog_painb7    ] {ai_pain(2);};
  236. void() dog_painb7    =[    $painb7 ,    dog_painb8    ] {};
  237. void() dog_painb8    =[    $painb8 ,    dog_painb9    ] {ai_pain(4);};
  238. void() dog_painb9    =[    $painb9 ,    dog_painb10    ] {};
  239. void() dog_painb10    =[    $painb10 ,    dog_painb11    ] {ai_pain(10);};
  240. void() dog_painb11    =[    $painb11 ,    dog_painb12    ] {};
  241. void() dog_painb12    =[    $painb12 ,    dog_painb13    ] {};
  242. void() dog_painb13    =[    $painb13 ,    dog_painb14    ] {};
  243. void() dog_painb14    =[    $painb14 ,    dog_painb15    ] {};
  244. void() dog_painb15    =[    $painb15 ,    dog_painb16    ] {};
  245. void() dog_painb16    =[    $painb16 ,    dog_run1    ] {};
  246.  
  247. void() dog_pain =
  248. {
  249.     sound (self, CHAN_VOICE, "dog/dpain1.wav", 1, ATTN_NORM);
  250.  
  251.     if (random() > 0.5)
  252.         dog_pain1 ();
  253.     else
  254.         dog_painb1 ();
  255. };
  256.  
  257. void() dog_die1        =[    $death1,    dog_die2    ] {};
  258. void() dog_die2        =[    $death2,    dog_die3    ] {};
  259. void() dog_die3        =[    $death3,    dog_die4    ] {};
  260. void() dog_die4        =[    $death4,    dog_die5    ] {};
  261. void() dog_die5        =[    $death5,    dog_die6    ] {};
  262. void() dog_die6        =[    $death6,    dog_die7    ] {};
  263. void() dog_die7        =[    $death7,    dog_die8    ] {};
  264. void() dog_die8        =[    $death8,    dog_die9    ] {};
  265. void() dog_die9        =[    $death9,    dog_die9    ] {};
  266.  
  267. void() dog_dieb1        =[    $deathb1,    dog_dieb2    ] {};
  268. void() dog_dieb2        =[    $deathb2,    dog_dieb3    ] {};
  269. void() dog_dieb3        =[    $deathb3,    dog_dieb4    ] {};
  270. void() dog_dieb4        =[    $deathb4,    dog_dieb5    ] {};
  271. void() dog_dieb5        =[    $deathb5,    dog_dieb6    ] {};
  272. void() dog_dieb6        =[    $deathb6,    dog_dieb7    ] {};
  273. void() dog_dieb7        =[    $deathb7,    dog_dieb8    ] {};
  274. void() dog_dieb8        =[    $deathb8,    dog_dieb9    ] {};
  275. void() dog_dieb9        =[    $deathb9,    dog_dieb9    ] {};
  276.  
  277.  
  278. void() dog_die =
  279. {
  280. // check for gib
  281.     if (self.health < -35)
  282.     {
  283.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  284.         ThrowGib ("progs/gib3.mdl", self.health);
  285.         ThrowGib ("progs/gib3.mdl", self.health);
  286.         ThrowGib ("progs/gib3.mdl", self.health);
  287.         ThrowHead ("progs/h_dog.mdl", self.health);
  288.         return;
  289.     }
  290.  
  291. // regular death
  292.     sound (self, CHAN_VOICE, "dog/ddeath.wav", 1, ATTN_NORM);
  293.     self.solid = SOLID_NOT;
  294.  
  295.     if (random() > 0.5)
  296.         dog_die1 ();
  297.     else
  298.         dog_dieb1 ();
  299. };
  300.  
  301. //============================================================================
  302.  
  303. /*
  304. ==============
  305. CheckDogMelee
  306.  
  307. Returns TRUE if a melee attack would hit right now
  308. ==============
  309. */
  310. float()    CheckDogMelee =
  311. {
  312.     if (enemy_range == RANGE_MELEE)
  313.     {    // FIXME: check canreach
  314.         self.attack_state = AS_MELEE;
  315.         return TRUE;
  316.     }
  317.     return FALSE;
  318. };
  319.  
  320. /*
  321. ==============
  322. CheckDogJump
  323.  
  324. ==============
  325. */
  326. float()    CheckDogJump =
  327. {
  328.     local    vector    dist;
  329.     local    float    d;
  330.  
  331.     if (self.origin_z + self.mins_z > self.enemy.origin_z + self.enemy.mins_z
  332.     + 0.75 * self.enemy.size_z)
  333.         return FALSE;
  334.         
  335.     if (self.origin_z + self.maxs_z < self.enemy.origin_z + self.enemy.mins_z
  336.     + 0.25 * self.enemy.size_z)
  337.         return FALSE;
  338.         
  339.     dist = self.enemy.origin - self.origin;
  340.     dist_z = 0;
  341.     
  342.     d = vlen(dist);
  343.     
  344.     if (d < 80)
  345.         return FALSE;
  346.         
  347.     if (d > 150)
  348.         return FALSE;
  349.         
  350.     return TRUE;
  351. };
  352.  
  353. float()    DogCheckAttack =
  354. {
  355.     local    vector    vec;
  356.  
  357.  // dhm - Look for a bone to chew on instead of the player!  Code comments above.
  358.     local    entity    head;
  359.  
  360.     head = findradius(self.origin, 500);
  361.     
  362.     while (head)
  363.     {
  364.         if (head.classname == "bone")
  365.         {                        
  366.                  self.enemy = head;
  367.              self.goalentity = self.enemy;
  368.             self.think = self.th_run;
  369.             self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin);
  370.             self.nextthink = time + 0.1;
  371.         }
  372.         head = head.chain;
  373.     }
  374.  // dhm - end
  375.     
  376. // if close enough for slashing, go for it
  377.     if (CheckDogMelee ())
  378.     {
  379.         self.attack_state = AS_MELEE;
  380.         return TRUE;
  381.     }
  382.     
  383.     if (CheckDogJump ())
  384.     {
  385.         self.attack_state = AS_MISSILE;
  386.         return TRUE;
  387.     }
  388.     
  389.     return FALSE;
  390. };
  391.  
  392.  
  393. //===========================================================================
  394.  
  395. /*QUAKED monster_dog (1 0 0) (-32 -32 -24) (32 32 40) Ambush
  396.  
  397. */
  398. void() monster_dog =
  399. {
  400.     if (deathmatch)
  401.     {
  402.         remove(self);
  403.         return;
  404.     }
  405.     precache_model ("progs/h_dog.mdl");
  406.     precache_model ("progs/dog.mdl");
  407.  
  408.     precache_sound ("dog/dattack1.wav");
  409.     precache_sound ("dog/ddeath.wav");
  410.     precache_sound ("dog/dpain1.wav");
  411.     precache_sound ("dog/dsight.wav");
  412.     precache_sound ("dog/idle.wav");
  413.  
  414.     self.solid = SOLID_SLIDEBOX;
  415.     self.movetype = MOVETYPE_STEP;
  416.  
  417.     setmodel (self, "progs/dog.mdl");
  418.  
  419.     setsize (self, '-32 -32 -24', '32 32 40');
  420.     self.health = 25;
  421.  
  422.     self.th_stand = dog_stand1;
  423.     self.th_walk = dog_walk1;
  424.     self.th_run = dog_run1;
  425.     self.th_pain = dog_pain;
  426.     self.th_die = dog_die;
  427.     self.th_melee = dog_atta1;
  428.     self.th_missile = dog_leap1;
  429.  
  430.     walkmonster_start();
  431. };
  432.